// new操作符做了这些事：
// 创建一个全新的对象
// 这个对象的__proto__要指向构造函数的原型prototype
// 执行构造函数，使用 call/apply 改变 this 的指向
// 返回值为object类型则作为new方法的返回值返回，否则返回上述全新对象

function myNew(fn, ...args) {
  let instance = Object.create(fn.prototype)
  let res = fn.apply(instance, args)
  return typeof res == 'object' ? res : instance
}

function People() {
  this.name = ''
  this.age = ''
}
People.prototype.say = function() {
  console.log('??')
}
// new 就是相当于继承一个 对象  prototype及属性